//
//  HMEmticonTools.swift
//  Weibo
//
//  Created by teacher on 2017/6/14.
//  Copyright © 2017年 teacher. All rights reserved.
//

import UIKit
import YYModel

//  每页显示20个表情
private let NumberOfPage = 20
//  归档和解档路径
let RecentEmoitconArrayPath = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("recentEmoticonArray.archive")

//  表情数据操作工具类
class HMEmoticonTools: NSObject {
    //  单例全局访问点
    static let sharedTools: HMEmoticonTools = HMEmoticonTools()
    
    //  构造函数私有化
    private override init() {
        super.init()
    }
    
    //  创建bundle对象
    lazy var emoticonBundle: Bundle = {
        //  获取bundle文件的路径
        let path = Bundle.main.path(forResource: "Emoticons.bundle", ofType: nil)!
        //  根据path路径创建bundle对象
        let bundle = Bundle(path: path)!
        return bundle
    }()
    
    //  默认表情数据
    private lazy var defaultEmoticonArray: [HMEmoticon] = {
        return self.loadEmoticonArray(folderName: "default", fileName: "info.plist")
    }()
    
    //  emoji表情数据
    private lazy var emojiEmoticonArray: [HMEmoticon] = {
        return self.loadEmoticonArray(folderName: "emoji", fileName: "info.plist")
    }()
    
    //  浪小花表情数据
    private lazy var lxhEmoticonArray: [HMEmoticon] = {
        return self.loadEmoticonArray(folderName: "lxh", fileName: "info.plist")
    }()
    
    //  最近表情数据
    private lazy var recentEmoticonArray: [HMEmoticon] = {
        if let localArray = self.loadRecentEmoticonArray(), localArray.count > 0 {
            //  本地有最近表情数据，直接返回
            return localArray
        }
        //  代码执行到此，表示没有最近表情数据，返回空数组
        let emoticonArray = [HMEmoticon]()
        return emoticonArray
    }()
    
    //准备表情视图(collectionView)的数据源
    lazy var allEmoticonArray: [[[HMEmoticon]]] = {
        let sectionDefaultEmoticonArray: [[HMEmoticon]] = self.sectionWith(emoticonArray: self.defaultEmoticonArray)
        let sectionEmojiEmotionArray: [[HMEmoticon]] = self.sectionWith(emoticonArray: self.emojiEmoticonArray)
        let sectionLxhEmoitonArray: [[HMEmoticon]] = self.sectionWith(emoticonArray: self.lxhEmoticonArray)
        
        return [
                [self.recentEmoticonArray],
                sectionDefaultEmoticonArray,
                sectionEmojiEmotionArray,
                sectionLxhEmoitonArray
        ]
        
    }()
    
    //  根据文件夹和文件名获取对应的表情数据
    func loadEmoticonArray(folderName: String, fileName: String) -> [HMEmoticon] {
        //  会直接把系统bundle里面Contents和Resources这两层文件夹直接透过去
        let path = self.emoticonBundle.path(forResource: "\(folderName)/\(fileName)", ofType: nil)!
        //  获取plist文件数据
        let dicArray = NSArray(contentsOfFile: path) as! [[String: Any]]
        //  使用YYModel把字典数组转成模型数组
        let modelArray = NSArray.yy_modelArray(with: HMEmoticon.self, json: dicArray) as! [HMEmoticon]
        //  遍历模型数组
        for model in modelArray {
            if model.type == "0" {
                //  图片表情，需要设置图片对应的文件名，目的是在加载表情的时候使用
                model.path = folderName + "/" + model.png!
            }
        }
        
        return modelArray
    }
    
    //  根据每种表情数据拆分成对应的二维数组，表示显示多少页
    func sectionWith(emoticonArray: [HMEmoticon]) -> [[HMEmoticon]] {
        //  根据表情数组的个数计算页数， 每页最多显示20个表情
        let pageCount = (emoticonArray.count - 1) / NumberOfPage + 1
        
        var tempArray = [[HMEmoticon]]()
        //  遍历页数，截取每页对应表情数组
        for page in 0..<pageCount {
            //  开始截取的索引
            let loc = page * NumberOfPage
            //  截去的长度
            var len = NumberOfPage
            
            if loc + len > emoticonArray.count {
                //  超出范围,截取剩余个数
                len = emoticonArray.count - loc
            }
            
            //  截取子数组
            let subArray = (emoticonArray as NSArray).subarray(with: NSMakeRange(loc, len)) as! [HMEmoticon]
            tempArray.append(subArray)
        }
        
        return tempArray
    }
    
    //  保存指定表情数据到最近表情数组中
    func saveRecentEmoticon(emoticon: HMEmoticon, callBack: ()->()) {
        
        /*
            最近表情保存逻辑
                1. 判断最近表情数组中是否有指定的表情数据
                2. 如果有指定的表情，从数组中删除
                3. 把点击的表情插入到最近表情数组中的第一个元素的位置, 判断个数如果大于20，删除最后一个元素
                4. 修改allEmoticon里面的最近表情数据
                5. 使用归档保存最近表情数据
                6. 让表情视图刷新最近表情这组数据
         
         */
         // 1. 判断最近表情数组中是否有指定的表情数据
        for (i, recentEmoitcon) in recentEmoticonArray.enumerated() {
            if emoticon.type == "0" {
                //  图片表情，判断png是否相同
                if emoticon.png == recentEmoitcon.png {
                    //  删除指定表情模型
                    //  2. 如果有指定的表情，从数组中删除
                    recentEmoticonArray.remove(at: i)
                    break
                }
            } else {
                //  emoji表情，判断code是否相同
                if emoticon.code == recentEmoitcon.code {
                    //  删除指定表情模型
                    //  2. 如果有指定的表情，从数组中删除
                    recentEmoticonArray.remove(at: i)
                    break
                }
            }
        }
        
        //  代码执行到此，把点击的表情模型插入到数组的第一个元素位置
        //  3. 把点击的表情插入到最近表情数组中的第一个元素的位置
        //  再swift数组是结构体，是按值传递的，就是传递的是一个数组的副本
        recentEmoticonArray.insert(emoticon, at: 0)
        if recentEmoticonArray.count > 20 {
            //  最近表情最大只能显示20个，多余删除后面的元素
            recentEmoticonArray.removeLast()
        }
        
        //  4. 修改allEmoticon里面的最近表情数据
        allEmoticonArray[0][0] = recentEmoticonArray
        //  5. 使用归档保存最近表情数据
        NSKeyedArchiver.archiveRootObject(recentEmoticonArray, toFile: RecentEmoitconArrayPath)
        //  6. 刷新最近表情
        //  执行闭包回调，表示数据保存成功
        callBack()
    }
    
    //  加载本地最近表情数据
    private func loadRecentEmoticonArray() -> [HMEmoticon]? {
        //  解档本地的最近表情数据
        let localArray = NSKeyedUnarchiver.unarchiveObject(withFile: RecentEmoitconArrayPath) as? [HMEmoticon]
        return localArray
    }
    
    //  根据表情描述查询本地图片表情模型数组（默认表情数组，浪小花表情数组）
    func searchEmoticonWithChs(chs: String) -> HMEmoticon? {
        //  遍历默认表情数组
        for model in defaultEmoticonArray {
            if model.chs == chs {
                //  找到模型
                return model
            }
        }
        
        //  遍历浪小花表情数组
        for model in lxhEmoticonArray {
            if model.chs == chs {
                //  找到模型
                return model
            }
        }
        //  没有找到对应表情模型
        return nil
    }
    
}
